//用于控制一个超声波测距系统，并将结果显示在八个七段显示器（hex1至hex8）上，同时还有LED和蜂鸣器作为指示
module hc_sr_top (
    input   wire        Clk         ,     // 系统时钟输入
    input   wire        Rst_n       ,   // 复位信号输入，低电平有效
    input   wire        echo        ,    // 超声波回声信号输入

    output  wire        trig        ,// 超声波触发信号输出

    //// 8个显示器的段选信号输出
    output  wire [6:0]  hex1        ,
    output  wire [6:0]  hex2        ,
    output  wire [6:0]  hex3        ,
    output  wire [6:0]  hex4        ,
    output  wire [6:0]  hex5        ,
    output  wire [6:0]  hex6        ,
    output  wire [6:0]  hex7        ,
    output  wire [6:0]  hex8        ,

    
    output  wire        beep        ,// 蜂鸣器信号输出
    output  wire [3:0]  led         , // LED信号输出


    //vga需要的
    output			wire						vga_clk, // VGA时钟输出
    output			wire						h_sync,// 水平同步信号
    output			wire						v_sync,// 垂直同步信号
    output			wire		[ 4:0 ]			rgb_r,// 红色分量输出
    output			wire		[ 5:0 ]			rgb_g,// 绿色分量输出
    output			wire		[ 4:0 ]			rgb_b// 蓝色分量输出
    // output			reg		    [ 3:0 ]			led 


    
);



// data_o用于存储测距结果，是一个19位的宽数据总线
wire            [18:0]              data_o              ;//测量的距离数
// wire		    [23:0]			    distance_data	    ;
wire		    [2:0]			    key_flag			;  // 按键标志
wire		    [2:0]			    key_value			;  // 按键
wire							    clk_25			    ;



// hc_sr_driver模块实例化，用于驱动超声波测距硬件
hc_sr_driver u_hc_sr_driver(
    //in
    .Clk    (Clk            ),        // 连接时钟信号
    .Rst_n  (Rst_n          ),     // 连接复位信号
    .echo   (echo           ),       // 连接回声信号
    //out
    .trig   (trig           ),       // 连接触发信号输出
    .data_o (data_o         )       // 测距数据输出！！！！！！！！    
);


// seg_driver模块实例化，用于驱动八个 七段显示器
seg_driver u_seg_driver(
    //in
    .Clk        (Clk            ),        // 连接时钟信号
    .Rst_n      (Rst_n          ),     // 连接复位信号

    .data_o     (data_o         ),   // 测距数据输入！！！！！！！！！！！！！！！！！！
    
    //out
    .hex1       (hex1           ),//连接七段显示器1的段选信号输出
    .hex2       (hex2           ),
    .hex3       (hex3           ),
    .hex4       (hex4           ),
    .hex5       (hex5           ),
    .hex6       (hex6           ),
    .hex7       (hex7           ),
    .hex8       (hex8           ) 
);





/*
// 将系统时钟50MHz分频为25MHz时钟
clk_25MHz_div inst_clk_25MHz_div(
	//in
    .Clk(clk)				,// 连接系统时钟50MHzz
    .Rst_n(rst_n)			,// 连接复位信号
	//out
    .clk_25(clk_25)    		 // 输出25MHz时钟
);


// VGA驱动模块实例化
vga_dirve u_vga_dirve(
    //in
    .clk            ( clk_25           ),
    .rst_n          ( rst_n         ),
    .rgb_data       ( rgb_data      ), // 测距数据输入！！！！！！！！！！！！！！！！！！
    //out       
    .vga_clk        ( vga_clk       ),
    .h_sync         ( h_sync        ),
    .v_sync         ( v_sync        ),
    .rgb_r          ( rgb_r         ),
    .rgb_g          ( rgb_g         ),
    .rgb_b          ( rgb_b         ),
    .addr_h         ( addr_h        ),
    .addr_v         ( addr_v        )
);

//vag数据
data_drive u_data_drive(
    //in
    .clk           			(clk),
    .vga_clk       			( vga_clk       ),
    .rst_n         			( rst_n         ),
    .addr_h        			( addr_h        ),
    .addr_v        			( addr_v        ),
    // .data_vld      			( data_out_vld   ),
    .data_vld      			( 1   ),
    .distance_data 			( data_o ),
    //out
    .rgb_data      			( rgb_data      )
);

// */




wire    [3:0]      key_out              ;//从FSM_KEY输出的按键


// /*
// ljf_vga

// VGA驱动模块实例化
vga_dirve u_vga_dirve(
//in
.clk      ( clk ),
.rst_n    ( rst_n ),
.rgb_data ( rgb_data ),

//out
.vga_clk  ( vga_clk ),//根据系统时钟输出25MHz时钟
.h_sync   ( h_sync ),
.v_sync   ( v_sync ),
.rgb_r    ( rgb_r ),
.rgb_g    ( rgb_g ),
.rgb_b    ( rgb_b ),
.addr_h   ( addr_h ),
.addr_v   ( addr_v )
);

// 数据驱动模块实例化
data_drive u_data_drive(
//in
.vga_clk ( vga_clk ),//vga_dirve模块将输出25MHz时钟输入进去
.rst_n   ( rst_n ),
.addr_h  ( addr_h ),
.addr_v  ( addr_v ),
.key     ( {key_value[ 2 ] && key_flag[ 2 ], key_value[ 1 ] && key_flag[ 1 ], key_value[ 0 ] && key_flag[ 0 ] } ),

//out
.rgb_data  ( rgb_data )
);

// */







// beepled模块实例化，用于控制蜂鸣器和LED
beepled u_beepled(
    //in
    .Clk(Clk),        // 连接时钟信号
    .Rst_n(Rst_n),     // 连接复位信号
    .data_o(data_o),   // 连接测距数据输入
    //out
    .beep(beep),       // 连接蜂鸣器信号输出
    .led(led)          // 连接LED信号输出
);







endmodule